#include "forcasIndependentes.h"

ForcasIndependentes::ForcasIndependentes(MODEL * md)
{
    pModel=md;
    gravidade[0]=pModel->Gravity[0];
    gravidade[1]=pModel->Gravity[1];
    forcasGlobais *empuxo,*explosao;
    if (md->SeaMat != NULL)
    {
        empuxo = new Empuxo(md);
        forcas.push_back(empuxo);
    }
    if (md->explosao)
    {
        explosao = new Explosao(md);
        forcas.push_back(explosao);
    }
}
ForcasIndependentesParalelo::ForcasIndependentesParalelo(MODEL * md)
{
    pModel=md;
    gravidade[0]=pModel->Gravity[0];
    gravidade[1]=pModel->Gravity[1];
    forcasGlobais *empuxo,*explosao;
    if (md->SeaMat != NULL)
    {
        empuxo = new Empuxo(md);
        forcas.push_back(empuxo);
    }
    if (md->explosao)
    {
        explosao = new Explosao(md);
        forcas.push_back(explosao);
    }
}

void ForcasIndependentes::Gravidade(SPHERE*s)
{
    s->Force( s->Mass, gravidade );
}

void ForcasIndependentes::calcular()
{
    #pragma omp single
    {
        for (SPHERE* s = pModel->SPHList.Begin; s != NULL;s = s->Next)
        {
            Gravidade(s);
            for (int i=0;i<forcas.size();i++) forcas[i]->calcular(s);
        }
    }
    //barreira implícita
}

void ForcasIndependentesParalelo::calcular()
{
    #pragma omp for schedule (static,1)
    for (int i = 0; i < pModel->numProceEsf; i++)
    {
        SPHERE* testeFim;
        if (i!=pModel->numProceEsf-1) testeFim = pModel->threads[i+1];
        else testeFim=NULL;
        for (SPHERE* s = pModel->threads[i]; s != testeFim; s = s->Next)
        {
            Gravidade(s);
            for (int i=0;i<forcas.size();i++) forcas[i]->calcular(s);
        }
    }
    //barreira implícita
}
